package com.example.lettcode._202412._20241203;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
697. 数组的度
给定一个非空且只包含非负数的整数数组 nums，数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。

示例 1：
输入：nums = [1,2,2,3,1]
输出：2
解释：
输入数组的度是 2 ，因为元素 1 和 2 的出现频数最大，均为 2 。
连续子数组里面拥有相同度的有如下所示：
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组 [2, 2] 的长度为 2 ，所以返回 2 。

示例 2：
输入：nums = [1,2,2,3,1,4,2]
输出：6
解释：
数组的度是 3 ，因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组，因此返回 6 。

提示：
nums.length 在 1 到 50,000 范围内。
nums[i] 是一个在 0 到 49,999 范围内的整数。
 */
public class _02_shu_zu_de_du {
    public static void main(String[] args) {
        int[] nums = {1,2,2,3,1};
        System.out.println(findShortestSubArray(nums));
    }

    public static int findShortestSubArray(int[] nums) {
        Map<Integer, List<Integer>> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(nums[i])) {
                List<Integer> list = map.get(nums[i]);
                list.add(i);
            } else {
                List<Integer> list = new ArrayList<>();
                list.add(i);
                map.put(nums[i], list);
            }
        }

        int du = 0;
        for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
            List<Integer> list = entry.getValue();
            du = Math.max(list.size(), du);
        }

        int minLength = 50000;
        for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
            List<Integer> list = entry.getValue();
            if (list.size() == du) {
                Integer start = list.get(0);
                Integer end = list.get(list.size() - 1);
                minLength = Math.min(minLength, end - start + 1);
            }
        }

        return minLength;
    }


    public static int findShortestSubArray2(int[] nums) {
        Map<Integer, Integer[]> map = new HashMap<>();
        Integer[] max = {1, 1};
        for (int i = 0; i < nums.length; i++) {
            if (!map.containsKey(nums[i])) {
                map.put(nums[i], new Integer[]{1, i});
            } else {
                Integer[] cur = map.get(nums[i]);
                cur[0]++;
                if (cur[0] > max[0] || (cur[0] == max[0] && i - cur[1] + 1 > i - max[1] + 1)) {
                    max = new Integer[]{cur[0], i-cur[1]+1};
                }
            }
        }
        return max[1];
    }
}
